
# Задача 1
Описать необходимый инструментарий/техстек, реализующий следующий функционал. Не обязательно - практическая реализация:

- воспроизводимая сборка образа ОС для запуска в qemu
- целевая архитектура arm64
- ядро не ниже 6.1
- каталог /opt/share должен быть доступен на запись по сети
- при появление binary deb-пакета в /opt/share он должен перемещаться в каталог /var/www/html автоматически с минимальной задержкой
- другие файлы должны удаляться из каталога /opt/share с минимальной задержкой
- /var/www/html должен просматриваться по http
- в системе должен присутствовать пакет vim

Создать документ в формате markdown с описанием и обоснованием выбранных решений и командой для запуска в qemu

# Решение

## Сборка образа ОС

Были рассмотрены варианты:

- сборка средствами проектов buildroot/yocto
- сборка средствами проекта armbian
- сборка вручную с помощью debootstrap (https://gist.github.com/varqox/42e213b6b2dde2b636ef)
- сборка средствами проекта fai-diskimage (https://fai-project.org/fai-guide/).
- сборка средствами проекта debian-cloud-images (https://salsa.debian.org/cloud-team/debian-cloud-images)

Для решения задачи создания воспроизводимой сборки был выбран проект debian-cloud-images.
Изначально я натолкнулся на страницу https://cloud.debian.org/images/cloud/ с каталогом готовых образов ОС debian для облачных провайдеров. 
Свежий debian-12-nocloud-arm64 образ из этого каталога запустился через qemu без проблем, и выглядел как то, что можно брать за основу. 
Обзор исходных кодов проекта https://salsa.debian.org/cloud-team/debian-cloud-images дал понять, что собрать собственный образ можно с помощью пары команд.
Этот вариант показался мне самым удобным.

## Конфигурирование образа средствами проекта debian-cloud-images

- архитектуру arm64 выбираем через [параметр системы сборки](build.sh#L24).
- используем дистрибутив bookworm, который поставляется с ядром 6.1 (также указываем через параметры системы сборки)
- добавляем `vim` в файл, содержащий список дополнительных пакетов [package_config/EXTRAS](debian-cloud-images-patch/config_space/package_config/EXTRAS).

## Файловый http сервер
Для запуска файлового http сервера, раздающего содержимое каталога `/var/www/html`, используем встроенный механизм nginx. 
Без nginx сложно обойтись в современных системах, поэтому имеет смысл сразу его установить. 
Настраивается в файле [scripts/DEBIAN/20-init-nginx](debian-cloud-images-patch/config_space/scripts/DEBIAN/20-init-nginx).

## Сетевой доступ к файловой системе

Для предоставления доступа к каталогу `/opt/share` используем sftp сервер (встроенный в openssh сервер). 
Он легковесный, защищенный, работает "из коробки".
Настраивается в файле [scripts/DEBIAN/20-init-sftp](debian-cloud-images-patch/config_space/scripts/DEBIAN/20-init-sftp).

## Перемещение deb пакетов из /opt/share в /var/www/html

Для принятия решения о перемещении/удалении файлов из каталога `/opt/share`, используем bash-скрипт [scripts/DEBIAN/20-init-file-mover](debian-cloud-images-patch/config_space/scripts/DEBIAN/20-init-file-mover#L6).
Для отслеживания событий о появлении файлов в /opt/share используем программу inotifywait. 


## Сборка

Запустить сборку образа можно скриптом [build.sh](build.sh).
Лог сборки можно увидеть в файле [output/build.log](output/build.log).

# Запуск

Запустить образ можно скриптом [run.sh](run.sh) или командой:

```bash
sudo qemu-system-aarch64 \
    -M virt -cpu max \
    -m 2048 \
    -nographic \
    -bios ./QEMU_EFI.fd \
    -drive if=none,file=$IMAGENAME,id=hd0 -device virtio-blk-device,drive=hd0 \
    -nic user,hostfwd=tcp::8080-:80,hostfwd=tcp::2222-:22
```

Лог запуска ОС можно в файле [output/launch.log](output/launch.log).

Получить списк файлов в каталоге `/var/www/html` по http можно из терминала хостовой системы программой `curl`:
```bash
curl localhost:8080
```
Получить доступ к каталогу `/opt/share` можно из терминала хостовой стсиемы с помощью команды `sftp`:
```bash
sftp -P2222 sftp@localhost
```

Также для этих целей можно воспользоваться web-браузером и filezillа:

[<img src="output/screenshot.png" width="500">](output/screenshot.png)
